package com.whfc.emp.service;

import com.whfc.emp.entity.AppEmp;
import com.whfc.emp.entity.AppWorkPlan;
import com.whfc.emp.dto.WorkPlanPersonCheckResultDTO;
import com.whfc.entity.dto.Apply.rep.WorkPlan;
import com.whfc.entity.dto.Apply.req.WorkPlanCreatePlanReq;
import com.whfc.entity.dto.msg.AppMsgToUserDTO;
import com.whfc.fuum.entity.SysUser;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 工作计划服务接口
 */
public interface AppWorkPlanService {

    /**
     * 根据ID查询工作计划
     * 
     * @param id 工作计划ID
     * @return 工作计划实体
     */
    AppWorkPlan selectById(Integer id);

    /**
     * 逻辑删除工作计划
     * 
     * @param id 工作计划ID
     * @return 影响行数
     */
    int deleteById(Long id);

    /**
     * 选择性插入工作计划
     * 
     * @param record 工作计划实体
     * @return 影响行数
     */
    WorkPlanCreatePlanReq insertSelective(AppWorkPlan record);

    /**
     * 选择性更新工作计划
     * 
     * @param record 工作计划实体
     * @return 影响行数
     */
    int updateSelectiveById(AppWorkPlan record);

    /**
     * 多条件查询工作计划列表
     * 
     * @param auditStatus  审核状态
     * @param createUserId 创建人ID
     * @return 工作计划列表
     */
    List<AppWorkPlan> selectList(Integer auditStatus, Long createUserId);

    /**
     * 多条件查询工作计划列表
     * 
     * @param deptId          部门ID列表
     * @param createUserId    创建人ID
     * @param createTimeBegin 创建时间开始（可选）
     * @param createTimeEnd   创建时间结束（可选）
     * @return 工作计划列表
     */
    List<WorkPlan> selectWorkPlanList(List<Integer> deptId, Integer createUserId,
            String createTimeBegin, String createTimeEnd);

    /**
     * 更新工作计划审核状态
     * 
     * @param record 包含审核信息的实体
     * @return 影响行数
     */
    int updateAuditStatus(AppWorkPlan record);

    /**
     * 多条件查询工作计划列表
     * 
     * @return 工作计划列表
     */
    List<AppWorkPlan> selectAppWorkPlanList(Integer auditStatus, Integer userId, Integer id);

    WorkPlan getWorkPlanById(Integer id);

    /**
     * 查询工作计划列表（支持时间范围查询）
     * 
     * @param deptId          部门ID列表
     * @param createUserId    创建用户ID
     * @param createTimeBegin 创建时间开始
     * @param createTimeEnd   创建时间结束
     * @param startTimeBegin  开始时间-起始
     * @param startTimeEnd    开始时间-结束
     * @param endTimeBegin    结束时间-起始
     * @param endTimeEnd      结束时间-结束
     * @param auditStatus      审核状态
     * @return 工作计划列表
     */
    List<WorkPlan> selectWorkPlanListWithTimeRange(List<Integer> deptId, Integer createUserId,
            String createTimeBegin, String createTimeEnd,
            LocalDateTime startTimeBegin, LocalDateTime startTimeEnd,
            LocalDateTime endTimeBegin, LocalDateTime endTimeEnd, Integer auditStatus);

    /**
     * 校验工作计划人员数量
     * 查询已审核且开始时间在当前时间前后5分钟内的工作计划，校验施工人员数量与监控上报人数是否一致
     * 
     * @return 校验结果列表，包含不一致的工作计划信息
     */
    List<WorkPlanPersonCheckResultDTO> checkWorkPlanPersonCount();
    
    /**
     * 根据工作区域查询当天有效工作计划
     *
     * @param workAreaId 工作区域ID
     * @param currentDate 当前日期（格式：yyyy-MM-dd）
     * @return 当天有效的工作计划列表
     */
    List<AppWorkPlan> listValidPlansByWorkAreaAndDate(Integer workAreaId,  String currentDate);
    
    /**
     * 根据工作计划ID获取旁站监护人员列表
     * 
     * @param workPlanId 工作计划ID
     * @return 旁站监护人员列表
     */
    List<SysUser> getGuardianListByWorkPlanId(Integer workPlanId);

    List<AppMsgToUserDTO> sendAlarmMessageToWorkPlanGuardians(String title, String alarmMessage, Integer workPlanId);

    List<AppEmp> getWorkers(Integer workPlanId);

    List<Integer> getGuardianIdsByWorkPlanId(Integer workPlanId);

    boolean sendAlarmMessageToWorkPlanGuardians();
}